﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using CRM.Objetos;

namespace CRM.CapaDatos
{
    /// <summary>
    /// Clase para las operaciones de base de datos de los obejtivos
    /// </summary>
    public class DAOObjetivo
    {
        /// <summary>
        /// Variable para almacenar la cadena de conexion
        /// </summary>
        string cadenaConexion = string.Empty;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="cadena">Cadena de Conexion</param>
        public DAOObjetivo(string cadena)
        {
            cadenaConexion = cadena;
        }

        /// <summary>
        /// Metodo para crear un objetivo
        /// </summary>
        /// <param name="obj">Objeto objetivo</param>
        /// <returns>Id del objetivo recien creado</returns>
        public int Crear(Objetivo obj)
        {
            IDbConnection con = GenericProvider.CreateConnection(cadenaConexion);
            IDbCommand com = GenericProvider.CreateStoredProcedure(con, "CREAR_OBJETIVO");

            IDbDataParameter nombre = GenericProvider.CreateParameter(com, "i_nombre", obj.Nombre);
            IDbDataParameter valor = GenericProvider.CreateParameter(com, "i_valor", obj.Valor);            
            IDbDataParameter flag = GenericProvider.CreateParameter(com, "i_flag", obj.FlagGeneral);
            IDbDataParameter cod = GenericProvider.CreateParameter(com, "i_cod", obj.CodGeneral);
            com.Parameters.Add(nombre);
            com.Parameters.Add(valor);
            com.Parameters.Add(flag);
            com.Parameters.Add(cod);

            con.Open();
            int retVal = (int)com.ExecuteScalar();
            con.Close();
            return retVal;
        }

        /// <summary>
        /// Metodo para editar un objetivo general o especifico
        /// </summary>
        /// <param name="obj">Objeto Objetivo</param>        
        public void Editar(Objetivo obj)
        {
            IDbConnection con = GenericProvider.CreateConnection(cadenaConexion);
            IDbCommand com = GenericProvider.CreateStoredProcedure(con, "EDITAR_OBJETIVO");

            IDbDataParameter id = GenericProvider.CreateParameter(com, "i_id", obj.Id);
            IDbDataParameter nombre = GenericProvider.CreateParameter(com, "i_nombre", obj.Nombre);
            IDbDataParameter valor = GenericProvider.CreateParameter(com, "i_valor", obj.Valor);
            IDbDataParameter flag = GenericProvider.CreateParameter(com, "i_flag", obj.FlagGeneral);
            IDbDataParameter cod = GenericProvider.CreateParameter(com, "i_cod", obj.CodGeneral);
            com.Parameters.Add(id);
            com.Parameters.Add(nombre);
            com.Parameters.Add(valor);
            com.Parameters.Add(flag);
            com.Parameters.Add(cod);

            con.Open();
            com.ExecuteNonQuery();
            con.Close();
        }

        /// <summary>
        /// Metodo para eliminar un objetivo
        /// </summary>
        /// <param name="obj_id">Id del objetivo a eliminar</param>
        public void Eliminar(string obj_id)
        {
            IDbConnection con = GenericProvider.CreateConnection(cadenaConexion);
            IDbCommand com = GenericProvider.CreateStoredProcedure(con, "ELIMINAR_OBJETIVO");

            IDbDataParameter id = GenericProvider.CreateParameter(com, "i_id", obj_id);
            com.Parameters.Add(id);

            con.Open();
            com.ExecuteNonQuery();
            con.Close();            
        }

        /// <summary>
        /// Metodo para construir un objetivo a partir de un cursor
        /// </summary>
        /// <param name="drObjetivos">Cursor de base de datos</param>
        /// <returns>Objeto objetivo</returns>
        private Objetivo Construir(IDataReader drObjetivos)
        {
            Objetivo obj = new Objetivo();
            obj.Id = drObjetivos.GetInt32(0);
            obj.Nombre = drObjetivos.GetString(1);
            obj.Valor = Convert.ToDouble(drObjetivos.GetDecimal(2));
            if(drObjetivos.GetInt32(3)==1)
                obj.FlagGeneral = true;
            return obj;
        }

        /// <summary>
        /// Metodo para listar todos los objetivos
        /// </summary>
        /// <returns>Lista de objetivos</returns>
        public List<Objetivo> ListarGenerales()
        {
            IDbConnection con = GenericProvider.CreateConnection(cadenaConexion);
            IDbCommand com = GenericProvider.CreateStoredProcedure(con, "LISTAR_OBJETIVOS");

            con.Open();
            IDataReader drObjetivos = com.ExecuteReader();
            List<Objetivo> listaObjetivos = new List<Objetivo>();

            while (drObjetivos.Read())
            {
                listaObjetivos.Add(Construir(drObjetivos));
            }

            drObjetivos.Close();
            con.Close();
            return listaObjetivos;
        }

        /// <summary>
        /// Metodo para listar objetivos especificos de un objetivo general
        /// </summary>
        /// <param name="objeId">Id del objetivo general</param>
        /// <returns>Listado de objetivos especificos</returns>
        public List<Objetivo> ListarEspecificos(int objeId)
        {
            IDbConnection con = GenericProvider.CreateConnection(cadenaConexion);
            IDbCommand com = GenericProvider.CreateStoredProcedure(con, "OBTENER_OBJETIVO");
            
            IDbDataParameter parObjeId = GenericProvider.CreateParameter(com, "i_objeid", objeId);
            com.Parameters.Add(parObjeId);

            con.Open();
            IDataReader drObjetivos = com.ExecuteReader();
            List<Objetivo> listaObjetivos = new List<Objetivo>();

            while (drObjetivos.Read())
            {
                listaObjetivos.Add(Construir(drObjetivos));
            }

            drObjetivos.Close();
            con.Close();
            return listaObjetivos;
        }

    }
}
